[XEN] Fix shadow2 integration with writable-pagetable logic.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 21 Aug 2006 09:28:02 +0000 (10:28 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 21 Aug 2006 09:28:02 +0000 (10:28 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/mm.c

index 7ec237ee8bf5f397da24a35eba8b15008a01dd98..2c42f05ee907ea980de8b7fab0c15e8eca614adc 100644 (file)
@@ -3139,13 +3139,14 @@ static int ptwr_emulated_update(
         }
     }
 
-    /* Checked successfully: do the update (write or cmpxchg). */
     pl1e = map_domain_page(page_to_mfn(page));
     pl1e = (l1_pgentry_t *)((unsigned long)pl1e + (addr & ~PAGE_MASK));
+
+    if ( shadow2_mode_enabled(d) )
+        shadow2_lock(d);
+
     if ( do_cmpxchg )
     {
-        if ( shadow2_mode_enabled(d) )
-            shadow2_lock(d);
         ol1e = l1e_from_intpte(old);
         if ( cmpxchg((intpte_t *)pl1e, old, val) != old )
         {
@@ -3155,11 +3156,6 @@ static int ptwr_emulated_update(
             put_page_from_l1e(nl1e, d);
             return X86EMUL_CMPXCHG_FAILED;
         }
-        if ( unlikely(shadow2_mode_enabled(v->domain)) )
-        {
-            shadow2_validate_guest_entry(v, _mfn(page_to_mfn(page)), pl1e);
-            shadow2_unlock(v->domain);    
-        }
     }
     else
     {
@@ -3168,6 +3164,12 @@ static int ptwr_emulated_update(
             BUG();
     }
 
+    if ( shadow2_mode_enabled(d) )
+    {
+        shadow2_validate_guest_entry(v, _mfn(page_to_mfn(page)), pl1e);
+        shadow2_unlock(v->domain);    
+    }
+
     unmap_domain_page(pl1e);
 
     /* Finally, drop the old PTE. */